import { isDate, isPlainObject } from './util'

/**
 * 字符串编码
 * @param val 需要编码的字符串
 */
function encode(val: string): string {
  return encodeURIComponent(val)
    .replace(/%40/g, '@')
    .replace(/%3A/gi, ':')
    .replace(/%24/g, '$')
    .replace(/%2C/gi, ',')
    .replace(/%20/g, '+')
    .replace(/%5B/gi, '[')
    .replace(/%5D/gi, ']')
}

/**
 * params 参数的处理
 * @param url 请求地址
 * @param params 请求参数
 */
export function buildURL(url: string, params?: any): string {
  if (!params) {
    return url
  }
  const parts: string[] = []
  Object.keys(params).forEach(key => {
    const val = params[key]
    if (val == null || typeof val === 'undefined') {
      return '' // forEach 是不能跳出的，是进入下一次的循环
    }
    let values = []

    if (Array.isArray(val)) {
      values = val
      key += '[]'
    } else {
      values = [val]
    }
    values.forEach(v => {
      if (isDate(v)) {
        v = v.toISOString()
      } else if (isPlainObject(v)) {
        v = JSON.stringify(v)
      }
      parts.push(`${encode(key)}=${encode(v)}`)
    })
  })
  // 通过 & 分割参数
  let serializedParams = parts.join('&')
  if (serializedParams) {
    // 提取出 HASH 的部分，不需要处理
    const markIndex = url.indexOf('#')
    if (markIndex !== -1) {
      url = url.slice(0, markIndex)
    }
    // 如果原来的 URL 有 ？ 说明有参数直接拼接 &，反之没有参数，拼接 ？
    url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams
  }
  console.log('编码后的URL：', url)
  return url
}
